import cv2 as cv
import numpy as np
import copy
# 在测试视频(OpenCV安装目录\sources\samples\data)上，使用基于混合高斯模型的背景提取算法，提取前景并显示(显示二值化图像，前景为白色)。
videoFileName=r"D:\AI\第三周\vtest.avi"
cap=cv.VideoCapture(videoFileName)
fgbg=cv.createBackgroundSubtractorMOG2()

thresh=200
count=0
while True:
    ret,frame=cap.read()
    if not ret:#没读到当前帧，结束
        break
    fgmask=fgbg.apply(frame)# 运用MOG2的apply方法完成对背景的更新，返回经过背景更新采集到的前景对应的掩膜，fgmask是一个二值化
#                                  # 图像，白色代表前景的像素
    _,fgmask = cv.threshold(fgmask, 30,0xff, cv.THRESH_BINARY)#阈值化处理，过滤
    bgImage=fgbg.getBackgroundImage()
    _,cnts,_=cv.findContours(fgmask.copy(),cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
    for c in cnts:
        area=cv.contourArea(c)
        if (area<thresh):
            continue
        count+=1
        x,y,w,h=cv.boundingRect(c)
        cv.rectangle(frame,(x,y),(x+w,y+h),(0,0xff,0),2)
    print('共检测到',count,frame)
    cv.imshow('frame',frame)
    cv.imshow('Background',bgImage)
    cv.imshow("Foregroundmask", fgmask)  # 前景
    key=cv.waitKey(30)
    if key==27:
        break
cap.release()
cv.destroyAllWindows()